package com.huluobo.jetpackdemo.paging

import android.util.Log
import androidx.paging.PagingSource
import androidx.paging.PagingState
import java.lang.Exception

/**
 *  Created by LC on 2024/10/17.
 *  paging的数据源
 */
class RepoPagingSource(val apiService: ApiService) : PagingSource<Int, Item>() {
    override fun getRefreshKey(state: PagingState<Int, Item>): Int? {
        return null
    }

    var sum = 0

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Item> {
        return try {
            val page = params.key ?: 1//当前的页码,如果为空默认等于1,如果不为空,就是当前的页码,1,2,3,4页
            val pageSize = params.loadSize //当前页码的item的数量
            val repoResponse = apiService.getPagingData(page, pageSize)//发起网络请求,产生response返回
            val repoItems = repoResponse.items//请求返回的数据源,由于最外层不能直接复制给RecyclerView,所以类似于adapter中的data
            //以上4步最终目的是拿到请求的数据源,也就是成功中的data

            sum += repoItems.size
            Log.i("TagA", "sum:$sum")

            val preKey = if (page > 1) page - 1 else null //向前翻页,必须页码要大于1,才能向前翻页
            val nextKey = if (repoItems.isNotEmpty()) page + 1 else null // 向后翻页,需要判断返回的数据源是否为空,为空则代表已经没有更多数据了,再向后翻页没有意义
            LoadResult.Page(repoItems, preKey, nextKey)//相当于success,请求成功,填入数据,向前和向后翻页的key
        } catch (e: Exception) {
            LoadResult.Error(e)//当当与failed
        }
    }
}